// Menu
var PauseMenu : GameObject;
var WinMenu : GameObject;

//var playerDamage = 0;

// Spielstatus
var waveActive : boolean = false; // Welle gerade im Moment aktiv?
var spawnEnemies : boolean = false; // Werden Gegner gespawnt?
var healthCount : int = 10;
var scoreCount : int = 0;
var cashCount : int = 1000;
var cashFlowAmount : int = 1;
var cashTime : int = 0;

// GUI-Anzeigen aktualisieren (werden im Spiel eingefuegt!)
var WaveText : UILabel;
var HealthText : UILabel;
var ScoreText : UILabel;
var CashText : UILabel;

// Kosten
var turretCosts : int[];
var costTexts : UILabel[];

// Wellenspezifikation
var waveLevel : int = 0; // Aktuelle Welle
var difficultyMultiplier : float = 1; // Hiermit gobal die Schwierigkeit modifizieren
var waveLength : float = 20; // Dauer des Spawning der aktuellen Welle
var intermissionTime : float = 5; // Wieviel Zeit zwischen den Wellen
private var waveEndTime : float = 0; // Nur zum Checken (private!)

// Referenz auf Gleiter-Prefab
var enemyPrefabs : GameObject[];
// Referenz auf das Null-Parent-Objekt der Spawnpunkte Air
var AirSpawns : Transform;
// Referenz auf das Null-Parent-Objekt der Spawnpunkte Ground
var GroundSpawns : Transform;
// Array fuer die einzulesenden Spawnpunkte Air
private var AirSpawnPoints : Transform[];
// Array fuer die einzulesenden Spawnpunkte Ground
private var GroundSpawnPoints : Transform[];

// Waypoint-System
var waypointParent : Transform;
var waypoint : Transform[];

//var respawnMinBase : float = 3;
//var respawnMaxBase : float = 10;
//private var respawnMin : float = 3;
//private var respawnMax : float = 10;
var interval : float = 3;
var enemyCount : int = 0; // Buchhaltungsvariable fuer Gegner
private var lastSpawnTime : float = 0; // Wann war der letzte Spawn -> wieder bereit?

// Sounds
var nextWave : AudioClip;

function Start() {
	Time.timeScale = 1.0;
	AirSpawnPointsInitialize();
	GroundSpawnPointsInitialize();
	SetNextWave();
	yield WaitForSeconds(11); // Abwarten
	StartNewWave();
}

function AirSpawnPointsInitialize() {
	// Array der Groesse gleich Anzahl Spawnpunkte Air
	AirSpawnPoints = new Transform[AirSpawns.childCount];
	var i : int = 0; // Zaehler for-each-Schleife
	for (var theSpawnPoint : Transform in AirSpawns) {
		AirSpawnPoints[i] = theSpawnPoint;
		i++;
	}
}

function GroundSpawnPointsInitialize() {
	// Array der Groesse gleich Anzahl Spawnpunkte Ground
	GroundSpawnPoints = new Transform[GroundSpawns.childCount];
	var i : int = 0; // Zaehler for-each-Schleife
	for (var theSpawnPoint : Transform in GroundSpawns) {
		GroundSpawnPoints[i] = theSpawnPoint;
		i++;
	}
}

// Zeit zu spawnen?
function Update() {
	Tastatureingaben();
	cashFlow();
	if (waveActive) {
		if (Time.time >= waveEndTime) // Zeit abgelaufen?
		{
			spawnEnemies = false; // keine neuen Gegner mehr
			if (enemyCount == 0) // alle Gegner vom Feld?
			{
				FinishWave(); // Welle beenden
			}
		}

		if (spawnEnemies) // Noch Gegner spawnen?
		{
			if (Time.time >= (lastSpawnTime + interval)) // Intervalzeit eingehalten?
			{
				SpawnNewEnemies(); // Gegner spawnen
			}
		}
	}
}

function Tastatureingaben() {
	if (Input.GetKeyDown(KeyCode.Escape)) {
		Time.timeScale = 0.0;
		PauseMenu.SetActive(true);
	}
}

function cashFlow() {
	if (cashTime <= Time.time) {
		cashCount += cashFlowAmount;
		cashTime = Time.time + 1;
		UpdateGUI();
	}
}

function SetNextWave() {
	waveLevel++;
	interval -= 0.175;
	waveLength += 4;
	//difficultyMultiplier = ((Mathf.Pow(waveLevel, 2)) * .0005) + 1;
	//respawnMin = respawnMinBase * (1 / difficultyMultiplier);
	//respawnMax = respawnMaxBase * (1 / difficultyMultiplier);
}

function StartNewWave() {
	UpdateGUI();
	SpawnNewEnemies();
	waveActive = true;
	spawnEnemies = true;
	waveEndTime = Time.time + waveLength;
}

function UpdateGUI() {
	WaveText.text = "Wave: " + waveLevel + " of 10";
	ScoreText.text = "Score: " + scoreCount;
	HealthText.text = "Health: " + healthCount;
	CashText.text = "Cash: " + cashCount;
}

function FinishWave() {
	waveActive = false; // Welle abschalten
	// Ist das Level geschafft?
	if (waveLevel < 10) {
		audio.PlayOneShot(nextWave);
		yield WaitForSeconds(intermissionTime); // Abwarten
		SetNextWave(); // neue Welle initialisieren
		StartNewWave(); // neue Welle starten
	} else {
		SaveHighscore();
		WinMenu.SetActive(true);
	}
}

function SpawnNewEnemies() {
	var enemyChoice = Random.Range(0, enemyPrefabs.length);

	var spawnChoice : int;
	// Falls es sich um eine Flugeinheit handelt
	if (enemyPrefabs[enemyChoice].tag == "Enemy_Air") {
		spawnChoice = Random.Range(0, AirSpawnPoints.length);
		Instantiate(enemyPrefabs[enemyChoice], AirSpawnPoints[spawnChoice].position, AirSpawnPoints[spawnChoice].rotation);
		enemyCount++;
	}
	// Falls es sich um eine Bodeneinheit handelt
	else if (enemyPrefabs[enemyChoice].tag == "Enemy_Ground") {
		spawnChoice = Random.Range(0, GroundSpawnPoints.length);
		Instantiate(enemyPrefabs[enemyChoice], GroundSpawnPoints[spawnChoice].position, GroundSpawnPoints[spawnChoice].rotation);
		enemyCount++;
	}

	// Allgemein / alle Gegner betreffend
	lastSpawnTime = Time.time;
	//interval = Random.Range(respawnMin, respawnMax);
}

function SaveHighscore() {
	// Alle Highscores durchlaufen
	for (var i = 1; i <= 10; i++) {
		// Falls noch kein Eintrag an i
		if(!PlayerPrefs.HasKey("Score" + i)){
			Debug.Log("Das sollte nicht passieren");
			// Eintragen
			PlayerPrefs.SetInt("Score" + i, this.scoreCount);
			PlayerPrefs.SetString("Player" + i, PlayerPrefs.GetString("LastPlayer"));
			PlayerPrefs.Save(); // Neues Ranking speichern
			return;
		}
		// Falls einer kleiner als aktueller scoreCount
		else if (PlayerPrefs.HasKey("Score" + i) && this.scoreCount > PlayerPrefs.GetInt("Score" + i)) {
			// Nach hinten verschieben
			for (var j = 10; j > i; j--) {
				PlayerPrefs.SetInt("Score" + j, PlayerPrefs.GetInt("Score" + (j - 1)));
				PlayerPrefs.SetString("Player" + j, PlayerPrefs.GetString("Player" + (j - 1)));
			}
			// Ueberschreiben
			PlayerPrefs.SetInt("Score" + i, this.scoreCount);
			PlayerPrefs.SetString("Player" + i, PlayerPrefs.GetString("LastPlayer"));
			PlayerPrefs.Save(); // Neues Ranking speichern
			return;
		}
	}

}
